﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JGSY.Tasks
{
    public static class awaitAsync
    {
        public static async Task awaitAsync001()
        {
            // 示例1：单个异步操作 + 取消令牌
            var cts = new CancellationTokenSource(3000); // 3秒后自动取消
            try
            {
                var content = await DownloadContentAsync("https://example.com", cts.Token);
                Console.WriteLine($"下载成功，内容长度：{content.Length}");
            }
            catch (TaskCanceledException)
            {
                Console.WriteLine("操作被取消或超时");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"异常：{ex.Message}");
            }

            // 示例2：多个任务竞速 + 超时控制
            var urls = new[] { "https://example.com", "https://microsoft.com", "https://github.com" };
            var tasks = urls.Select(url => DownloadContentAsync(url, CancellationToken.None)).ToList();

            // 等待任意一个任务完成，或超时5秒
            var completedTask = await Task.WhenAny(tasks.Concat(new[] { Task.Delay(5000) }));

            if (completedTask is Task<string> contentTask)
            {
                // 进入此代码块的条件：contentTask 仅if块内使用
                // 1. completedTask 是 Task<string> 类型
                // 2. contentTask 是 completedTask 转换后的变量
                //string result = await contentTask; // 可以安全地获取结果

                // if (completedTask is Task<string> contentTask) 等价于下面if
                //if (completedTask is Task<string>)
                //{
                //    Task<string> stringTask = (Task<string>)completedTask; // 显式类型转换
                //    string result = await stringTask;
                //}
                try
                {
                    var result = await contentTask;
                    Console.WriteLine($"最快完成：{result.Substring(0, 50)}...");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"任务异常：{ex.Message}");
                }
            }
            else
            {
                Console.WriteLine("所有任务超时");
            }

            // 示例3：检查任务状态
            var pendingTask = tasks.FirstOrDefault(t => !t.IsCompleted);
            if (pendingTask != null)
            {
                Console.WriteLine($"任务状态：{pendingTask.Status}"); // 可能是 Running, WaitingForActivation 等
            }
        }

        static async Task<string> DownloadContentAsync(string url, CancellationToken token)
        {
            using var client = new HttpClient();
            client.Timeout = TimeSpan.FromSeconds(4); // 设置HttpClient超时

            // 使用 ConfigureAwait(false) 避免捕获上下文（提升性能）
            var response = await client.GetAsync(url, token).ConfigureAwait(false);
            response.EnsureSuccessStatusCode(); // 抛出异常如果HTTP错误
            return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
        }
    }
}
